﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;

//1.类模板；
//template<class NameType, class AgeType>
//4.类模板可以有默认类型；
template<class NameType, class AgeType = int>
class PersonClass
{
public:
	PersonClass(NameType name, AgeType age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	void showPerson()
	{
		cout << "4.姓名： " << this->m_Name << " ,年龄： " << this->m_Age << endl;
	}

	NameType m_Name;
	AgeType m_Age;
};
void testClassTemplate()
{
	//2.自动类型推导，类模板，不支持；
	//PersonClass p("孙悟空",100);

	//3.显示指定类型；
	PersonClass<string, int> p("孙悟空", 100);
	p.showPerson();//4.姓名： 孙悟空 ,年龄： 100
}

class Person1
{
public:
	void showPerson1()
	{
		cout << "Person1的调用！" << endl;
	}
};
class Person2
{
public:
	void showPerson2()
	{
		cout << "Person2的调用！" << endl;
	}
};
template <class T>
class MyClass
{
public:
	T obj;
	void func1()
	{
		obj.showPerson1();
	}
	void func2()
	{
		obj.showPerson2();
	}
};
//5.成员函数，一开始不会创建出来，而是在运行时才去创建；
void testTemplateMemberFunc()
{
	MyClass<Person1> m;
	m.func1();//Person1的调用！
	//m.func2();
}

//main301：类模板的基本用法
int main301()
{
	testClassTemplate();
	testTemplateMemberFunc();

	system("pause");
	return EXIT_SUCCESS;
}